In [1]:
# Importar las librerías necesarias
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px

# Cargar los archivos .TXT con el delimitador correcto
assay = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\ASSAY.TXT", delimiter=',')  # Leyes del mineral
survey = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\SURVEY.txt", delimiter=',')  # Coordenadas del sondaje
header = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\HEADER.txt", delimiter=',')  # Información del sondaje

# Verificamos las primeras filas de cada archivo para asegurarnos de que se cargaron correctamente
print("Datos de ASSAY:")
print(assay.head())
print("Datos de SURVEY:")
print(survey.head())
print("Datos de HEADER:")
print(header.head())
Datos de ASSAY:
  HOLE-ID  FROM   TO    S      CU
0    B225     0   33  0.7  0.0945
1    B225    33   57  1.1  0.0095
2    B225    57   76  2.1  0.0095
3    B225    76   88  2.6  0.1040
4    B225    88  100  2.4  0.6615
Datos de SURVEY:
  HOLE-ID  FROM   TO  AZIMUTH  DIP
0    B225     0  524        0  -90
1    B226     0  500        0  -90
2    B227     0  490        0  -90
3    B228     0  443        0  -90
4    B229     0  300        0  -90
Datos de HEADER:
  HOLE-ID  LOCATIONX  LOCATIONY  LOCATIONZ  LENGTH
0    B225    3030.90    1783.98     494.05     524
1    B226    3010.93    2037.64     518.96     527
2    B227    2582.59    2183.70     523.88     490
3    B228    2820.16    1374.34     496.39     443
4    B229    2943.51    2210.39     499.36     300
In [2]:
# Unir los datos de ASSAY, SURVEY y HEADER para crear un único DataFrame para análisis
# Asumimos que existe una columna 'HOLE-ID' que conecta los archivos
merged_data = pd.merge(assay, survey, on='HOLE-ID')
merged_data = pd.merge(merged_data, header, on='HOLE-ID')

# Verificamos el DataFrame combinado
print("Datos combinados:")
print(merged_data.head())

# Gráfico 3D interactivo usando Plotly
def graficar_compositos_3d(dataframe):
    """
    Función para graficar los compositos en un gráfico 3D interactivo usando Plotly.
    Colorea los puntos según la ley de mineral (CU).
    """
    fig = px.scatter_3d(
        dataframe,
        x='LOCATIONX', y='LOCATIONY', z='LOCATIONZ',  # Coordenadas
        color='CU',  # Color basado en la concentración de cobre
        color_continuous_scale='Viridis',  # Paleta de colores
        title='Compositos de Sondajes - Concentración de Mineral (CU)',
        labels={'CU': 'Ley de Cobre (%)'}
    )
    fig.update_layout(scene=dict(
        xaxis_title='X (m)',
        yaxis_title='Y (m)',
        zaxis_title='Z (m)'))
    fig.show()

# Llamar la función para graficar
graficar_compositos_3d(merged_data)

# Gráfico 2D con Seaborn
def graficar_mapa_calor(dataframe):
    """
    Función para crear un mapa de calor de la ley de cobre en las coordenadas X y Y, coloreado por concentración.
    """
    plt.figure(figsize=(10, 8))
    scatter = sns.scatterplot(
        data=dataframe, 
        x='LOCATIONX', 
        y='LOCATIONY', 
        hue='CU', 
        palette='coolwarm', 
        size='CU', 
        sizes=(20, 200),
        legend='brief'
    )
    
    # Crear la barra de color manualmente usando el mapeo
    norm = plt.Normalize(dataframe['CU'].min(), dataframe['CU'].max())
    sm = plt.cm.ScalarMappable(cmap='coolwarm', norm=norm)
    sm.set_array([])
    plt.colorbar(sm, label='Ley de Cobre (%)')  # Agregar la barra de color
    plt.title('Distribución de Ley de Cobre en Coordenadas XY')
    plt.xlabel('Coordenada X (m)')
    plt.ylabel('Coordenada Y (m)')
    plt.show()

# Llamar la función para graficar el mapa de calor
graficar_mapa_calor(merged_data)

# Gráfico adicional: Histograma de distribución de leyes
def graficar_histograma_ley(dataframe):
    """
    Función para crear un histograma de la distribución de las leyes de mineral (CU).
    """
    plt.figure(figsize=(10, 6))
    sns.histplot(dataframe['CU'], kde=True, color='blue', bins=20)
    plt.title('Distribución de Ley de Cobre')
    plt.xlabel('Ley de Cobre (%)')
    plt.ylabel('Frecuencia')
    plt.show()

# Llamar la función para graficar el histograma
graficar_histograma_ley(merged_data)
Datos combinados:
  HOLE-ID  FROM_x  TO_x    S      CU  FROM_y  TO_y  AZIMUTH  DIP  LOCATIONX  \
0    B225       0    33  0.7  0.0945       0   524        0  -90     3030.9   
1    B225      33    57  1.1  0.0095       0   524        0  -90     3030.9   
2    B225      57    76  2.1  0.0095       0   524        0  -90     3030.9   
3    B225      76    88  2.6  0.1040       0   524        0  -90     3030.9   
4    B225      88   100  2.4  0.6615       0   524        0  -90     3030.9   

   LOCATIONY  LOCATIONZ  LENGTH  
0    1783.98     494.05     524  
1    1783.98     494.05     524  
2    1783.98     494.05     524  
3    1783.98     494.05     524  
4    1783.98     494.05     524  
In [3]:
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import tkinter as tk
from tkinter import ttk

# Función para leer los archivos de datos
def leer_datos():
    """
    Función para leer los archivos de datos desde rutas específicas.
    """
    # Leer archivos
    assay = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\ASSAY.TXT", sep=',', header=0)  # Leyes del mineral
    survey = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\SURVEY.txt", sep=',', header=0)  # Coordenadas del sondaje
    header = pd.read_csv(r"C:\Users\mizai\Downloads\COMPOSITACION\HEADER.txt", sep=',', header=0)  # Información del sondaje
    
    # Unir datos por 'HOLE-ID'
    merged_data = assay.merge(survey, on='HOLE-ID').merge(header, on='HOLE-ID')
    return merged_data

# Función para mostrar una tabla con la información
def mostrar_tabla_compositos(dataframe):
    """
    Función para mostrar una tabla con la información más importante de los compositos.
    """
    # Crear una nueva ventana
    ventana_tabla = tk.Tk()
    ventana_tabla.title("Información de Compositos")

    # Crear un Treeview para mostrar los datos
    tree = ttk.Treeview(ventana_tabla)
    tree['columns'] = list(dataframe.columns)
    
    for column in tree['columns']:
        tree.heading(column, text=column)
        tree.column(column, anchor='center')
    
    # Insertar los datos en el Treeview
    for index, row in dataframe.iterrows():
        tree.insert("", "end", values=list(row))
    
    tree.pack(side="top", fill="both", expand=True)
    ventana_tabla.mainloop()

# Función para graficar la distribución de la ley de cobre en coordenadas XY con proyección de sondajes en 3D
def graficar_distribucion_cu_3d(dataframe):
    """
    Función para graficar la distribución de la ley de cobre en coordenadas XY 
    con proyección de sondajes en 3D.
    """
    fig = plt.figure(figsize=(12, 8))
    ax = fig.add_subplot(111, projection='3d')

    # Extraer datos
    x = dataframe['LOCATIONX']
    y = dataframe['LOCATIONY']
    z = dataframe['CU']  # Ley de Cobre como eje Z

    # Graficar la distribución de la ley de cobre
    scatter = ax.scatter(x, y, z, c=z, cmap='viridis', marker='o', alpha=0.7)
    
    # Graficar los sondajes
    for index, row in dataframe.iterrows():
        ax.plot([row['LOCATIONX'], row['LOCATIONX']], [row['LOCATIONY'], row['LOCATIONY']], 
                zs=[0, row['CU']], color='gray', alpha=0.5)

    # Etiquetas y título
    ax.set_xlabel('Coordenada X (m)')
    ax.set_ylabel('Coordenada Y (m)')
    ax.set_zlabel('Ley de Cobre (%)')
    ax.set_title('Distribución de Ley de Cobre en 3D con Proyección de Sondajes')
    
    # Barra de colores
    cbar = plt.colorbar(scatter, ax=ax, pad=0.1)
    cbar.set_label('Ley de Cobre (%)')

    plt.show()

# Función principal
def main():
    # Leer los datos
    merged_data = leer_datos()

    # Llamar a la función para mostrar la tabla de compositos
    mostrar_tabla_compositos(merged_data)

    # Llamar a la función para graficar la distribución
    graficar_distribucion_cu_3d(merged_data)

# Ejecutar la función principal
if __name__ == "__main__":
    main()
In [ ]: